package com_.dxy_.test_.aop_test_;

import com_.dxy_.test_.aop_test_.target_.TestAopServiceV1;
import com_.dxy_.test_.aop_test_.target_.TestAopServiceV2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description 接口
 * @Author dangxianyue
 * @Date 2022/9/26 21:10
 */
@RestController
@RequestMapping("/test_aop")
public class TestAopController {

    //当使用JDK代理时，代理类是继承Proxy，实现被代理者的借口，故此处得用接口TestAopServiceV1接收代理类对象
    //当使用Cglib代理时，是子类继承的方式，即代理类是被代理者TestAopServiceV1Impl的子类，故此处可以用TestAopServiceV1Impl接收代理对象
    //这也是为什么SpringBoot2.x中默认是Cglib代理的原因
    @Autowired
    private TestAopServiceV1 testAopServiceV1;

    //即使设置了使用JDK代理，但若被代理者没有实现接口，则仍然是使用Cglib代理
    //在Cglib原生写法中支持类内方法间调用，但SpringBoot中不支持
    //详见：https://www.h5w3.com/181374.html
    @Autowired
    private TestAopServiceV2 testAopServiceV2;

    @GetMapping("/test_jdk_f1")
    public Object testJdkf1() {
        testAopServiceV1.f1();
        return "ok";
    }

    @GetMapping("/test_jdk_f2")
    public Object testJdkf2() {
        testAopServiceV1.f2();
        return "ok";
    }


    @GetMapping("/test_cglib")
    public Object testCglib() {
        testAopServiceV2.f1();
        return "ok";
    }

}
